/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.edu.unicen.twitter.suggest.backend.datasources.dao;

import ar.edu.unicen.twitter.suggest.backend.datasources.dao.util.CustomHibernateDaoSupport;
import ar.edu.unicen.twitter.suggest.backend.dtos.UsuarioApi;
import ar.edu.unicen.twitter.suggest.backend.dtos.UsuarioBasico;

/**
 *
 * @author Alex
 */
import java.util.List;
import java.util.logging.Logger;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository("twitterDao")
public class TwitterDaoImpl extends CustomHibernateDaoSupport implements TwitterDao {

    private final static Logger LOGGER = Logger.getLogger(TwitterDaoImpl.class.getName()); 
    
    private CacheFIFO<Long, UsuarioApi> cache;
    
    private static final int MAX_CACHE = 4;
    
    public TwitterDaoImpl(){
        cache = new CacheFIFO<Long, UsuarioApi>(MAX_CACHE);
    }
            
    @Override
    @Transactional
    public void update(UsuarioApi u) {
        
        UsuarioApi result = (UsuarioApi) getSession().get(UsuarioApi.class, u.getId());
        if (result == null) {
            getSession().saveOrUpdate(u);
        } else {
            getSession().merge(u);
        }
        cache.put(u.getId(), u);
    }

    @Override
    @Transactional
    public UsuarioApi getUsuario(long id) {
        UsuarioApi result = cache.get(id);
//        
        if(result == null)
        {
//            LOGGER.log(Level.INFO, "obteniendo el usuario {0}", id);
            result = (UsuarioApi) getSession().get(UsuarioApi.class, id);
//            LOGGER.log(Level.INFO, "usuario {0} obtenido con exito", id);
        }
        
        return result;
    }

    @Override
    @Transactional
    public UsuarioApi getUsuario(String screenName) {
        UsuarioApi result = null;
        if(result == null)
        {
//            LOGGER.log(Level.INFO, "obteniendo el usuario {0}", screenName);
            long id = getUserData(screenName).getId();
            result = (UsuarioApi) getSession().get(UsuarioApi.class, id);
//            LOGGER.log(Level.INFO, "usuario {0} obtenido con exito", screenName);
        }
        return result;
    }

    @Override
    @Transactional
    public UsuarioBasico getUserData(String screenName) {
        List list = getHibernateTemplate().find(
                "from UsuarioBasico where screenName=?", screenName);
        return (UsuarioBasico) list.get(0);
    }   
    
}